import { reactive } from "vue";

class StorageService {
  // 定义localData的类型为一个对象，其键为字符串，值为字符串类型（可根据实际需求调整更精确的类型）
  localData: { [key: string]: string } = reactive({});
  // 定义sessionData的类型为一个对象，其键为字符串，值为字符串类型（可根据实际需求调整更精确的类型）
  sessionData: { [key: string]: string } = reactive({});

  constructor() {
    this.loadFromLocalStorage();
    this.loadFromSessionStorage();
  }

  // 从本地存储加载数据
  loadFromLocalStorage() {
    // 遍历localStorage的键，由于localStorage的键本身就是字符串类型，这里可以直接使用
    for (const key in localStorage) {
      if (localStorage.hasOwnProperty(key)) {
        // 获取到的值类型是字符串，符合我们定义的localData中值的类型要求
        this.localData[key] = localStorage.getItem(key) as string;
      }
    }
  }

  // 从会话存储加载数据
  loadFromSessionStorage() {
    for (const key in sessionStorage) {
      if (sessionStorage.hasOwnProperty(key)) {
        this.sessionData[key] = sessionStorage.getItem(key) as string;
      }
    }
  }

  // 将数据保存到本地存储，key为字符串类型，value为字符串类型（同样可按需调整类型）
  saveToLocalStorage(key: string, value: string) {
    localStorage.setItem(key, value);
    this.localData[key] = value;
  }

  // 将数据保存到会话存储，key为字符串类型，value为字符串类型
  saveToSessionStorage(key: string, value: string) {
    sessionStorage.setItem(key, value);
    this.sessionData[key] = value;
  }

  // 从本地存储中移除数据，key为字符串类型
  removeFromLocalStorage(key: string) {
    localStorage.removeItem(key);
    delete this.localData[key];
  }

  // 从会话存储中移除数据，key为字符串类型
  removeFromSessionStorage(key: string) {
    sessionStorage.removeItem(key);
    delete this.sessionData[key];
  }

  // 清空本地存储
  clearLocalStorage() {
    localStorage.clear();
    // 重新初始化为空对象，以保持类型一致
    this.localData = {};
  }

  // 清空会话存储
  clearSessionStorage() {
    sessionStorage.clear();
    this.sessionData = {};
  }
}

export default new StorageService();
